<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>重写类字段</title>
</head>
<body>
<script>
    class User1 {
        constructor() {
            this.showName()
        }

        showName() {
            console.log(1)
        }
    }

    class Student1 extends User1 {
        showName() {
            console.log(2)
        }
    }

    new User1()
    /*
    * 子类没有构造器会访问父类构造器 虽然是父类的构造器但是此时因为创建的是子类的对象 所以父类构造器中的this是子类对象
    * */
    new Student1()


    /*
    *
    * 类字段无法被重写
    *
    * */
    class User2 {
        /*
        * 如果一个类中没有使用super那么类字段的初始化在构造函数之前执行
        *
        *
        * */
        name = 'A'

        constructor() {
            console.log(this.name)
        }
    }

    class Student2 extends User2 {

        //这种行为仅在一个重写的字段被父类构造器使用时才会显现出来   如果一定要避免的话可以使用set/get代替类字段

        /*
        * 类字段是有着固定值的字段   getter也有这种功能
        *
        *
        * */

        /*
        *因为继承了父类 所以会调用super  一旦调用了super 那么类字段的赋值在构造器之后
        * 但是子类会调用父类构造器打印this.类字段 这时子类的类字段还没有初始化所以只能访问父类的类字段
        *
        *
        * */
        name = 'B'

    }

    new User2()
    new Student2()


    /*
    * set/get属性是定义在对象身上而不是原型上的
    *
    * */
    class Demo {
        get name() {
            console.log(1)
        }
    }

    console.dir(new Demo())
</script>
</body>
</html>